iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0

簡介

這篇文章將介紹 FastAPI,這是一個與之前提到的 Django 和 Flask 同屬於 Web Application 框架。由於具備以下幾個特點,FastAPI 逐漸成為新星。

  1. 資料驗證
    FastAPI 依賴於前面介紹的 Pydantic 來驗證請求和回應資料。由於其驗證語法採用 Python 3.5 推出的型別註釋,使得開發者能夠輕鬆上手。

  2. 自動生成文件
    Web Application 會開放多個端點,以便用戶根據自身需求選擇適合的端點。以購物平台的商品為例,用戶可以呼叫 GET /products/ 來獲取所有商品資訊,或使用 POST /products/ 並提供商品名稱和價格來創建新商品。這兩個端點都遵循之前介紹的 RESTful 格式(HTTP 方法 GET 用於獲取資源,HTTP 方法 POST 用於創建資源)。如果開發者能提供端點的使用說明書,詳細說明如何使用各個端點以及注意事項,將大大提升用戶的使用體驗。此外,當存在許多用戶時,提供說明書可以有效降低雙方之間的溝通成本,避免重複解釋相同內容。
    對於許多 Web Application 框架(例如 Flask),開發者需要花費額外的時間來撰寫文檔。而 FastAPI 則能自動根據程式碼中的型別生成文檔,這大大降低了撰寫文檔的成本。

  3. 性能
    在之前的 Django 文章中,我們提到過 wsgi.pyasgi.py 這兩個檔案,並在 Gunicorn 的文章中詳細介紹了 WSGI。而 ASGI 目前尚未深入探討,FastAPI 正是基於 ASGI 架構,因此其性能得到了顯著提升。這部分內容將在下一篇文章中詳細介紹,本篇文章暫時略過。

範例

本次範例使用的是 FastAPI 0.112.4 版本。通常情況下,可以使用 poetry add fastapi==0.112.4 成功安裝 FastAPI。為了方便後續的開發,通常會額外安裝 standard 套件包,因此安裝指令會變更為以下

poetry add "fastapi[standard]==0.112.4"

首先,開發者需要根據 Pydantic 的規範來定義 Product 類別,在上一篇的 Pydantic 文章中已有詳細介紹。

接下來,開發者可以定義端點,其定義方式與 Python 的函數型別提示類似。比如,在範例中,函數的參數類型為空,而返回類型為 list[Product]。FastAPI 將通過這些型別提示來驗證接收到的 Request 和返回的 Response。

from fastapi import FastAPI
from pydantic import BaseModel, PositiveInt

class Product(BaseModel):
    name: str
    price: PositiveInt

app = FastAPI()

@app.get("/products/")
def get_products() -> list[Product]:
    return [
        Product(name="demo_1", price=56),
        Product(name="demo_2", price=102),
    ]

開發者可以通過執行指令 poetry run fastapi dev main.py 來啟動 Web Application

如果在網頁瀏覽器中輸入 http://127.0.0.1:8000/products/,將能夠獲取所有商品資訊(如下圖所示)。
https://ithelp.ithome.com.tw/upload/images/20240922/20168663hNM7K7a2kg.png

如果在網頁瀏覽器中輸入 http://127.0.0.1:8000/docs,將能看到自動生成的文檔(如下圖所示)。這份文檔是由名為 Swagger 的工具生成的。由於 FastAPI 與 Swagger 之間有高度整合,因此 FastAPI 能夠根據端點的型別提示自動生成文檔。在文檔中,您會看到 Parameters 區塊顯示為 No parameters,而 Responses 區塊則顯示一系列商品資訊,包括商品名稱(name)和價格(price)。
https://ithelp.ithome.com.tw/upload/images/20240922/20168663HF7Mf3eQlG.png

接下來,開發者可以定義一個用於新增商品的端點,該端點採用 POST HTTP Method。在範例中,函數的參數類型為 Product 類別,而返回類型也為 Product 類別。

@app.post("/products/")
def add_product(product: Product) -> Product:
    return product

同樣地,在網頁瀏覽器中輸入 http://127.0.0.1:8000/docs,可以查看新端點的資訊。Parameters 區塊顯示了該端點需要提供新的商品名稱(name)以及商品價格(price),而 Response 的結構則與商品資訊相同。
https://ithelp.ithome.com.tw/upload/images/20240922/20168663j4f7oKz5hQ.png


上一篇
[Day 08] Pydantic
下一篇
[Day 10] Uvicorn
系列文
Python 不止於數據,開發應用程式它也在行!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言